package com.hk.juc.memorymodel;

/**
 * 非volatile修饰的变量必须在获取、设置值的时间保证线程安全
 */
public class VolatileFeaturesExample2 {

    long v1 = 0L;

    //设置值时必须给方法加锁
    public synchronized void set(long l) {
        v1 = l;
    }

    //获取值也得给方法加锁获取
    public synchronized long get() {
        return v1;
    }

    //获取并新增
    public synchronized long getAndIncrement() {
        //调用线程安全的方法获取值
        long tempValue = get();
        //自增
        tempValue += 1L;
        //再调用线程安全的方法赋值
        set(tempValue);
        //最后返回
        return tempValue;
    }

}
